#pragma once
#include "rclcpp/rclcpp.hpp"
#include "io_macro.h"
// 对应参数 IO/module/* 模块结构体
struct ModuleParam
{

    // 模块编号，第几个模块,配置索引1此处索引0
    int module_number;
    // 当前模块支持几个输入点 8*x
    int num_digital_input;
    // 当前模块支持几个输出入点 8*x
    int num_digital_output;
    // 当前模块模拟量输入通道数
    int num_analog_input;
    // 当前模块模拟量输出通道数
    int num_analog_output;
    // 接口类型-canopen-modbus_tcp
    std::string interface_type;
    // 只有接口是modbus才使用-slave2 -关联硬件设备使用
    std::string modbus_slave_name;
    // 只有接口是modbus才使用 modbus起始地址
    int start_addr;
    // 只有接口是canopen或can才使用 can总线-can0-can1
    std::string can_port;
    // 只有接口是canopen或can才使用  can接口的节点id
    int node_id;

    ModuleParam()
    {
        module_number = 0;

        num_digital_input = 0;

        num_digital_output = 0;

        num_analog_input = 0;

        num_analog_output = 0;

        interface_type = "";

        modbus_slave_name = "slave0";

        start_addr = 0;

        can_port = "can0";

        node_id = 0;
    }
    // 如果io输入输出+模拟量通道都是0，则认为该模块未配置；无效
    bool valid()
    {
        return !(num_digital_input == 0 && num_digital_output == 0 && num_analog_input == 0 && num_analog_output == 0);
    }
    void print()
    {
        DEBUG_STREAM_OUT("module_number=" << module_number
                                         << ",num_digital_input=" << num_digital_input
                                         << ",num_digital_output=" << num_digital_output
                                         << ",num_analog_input=" << num_analog_input
                                         << ",num_analog_output=" << num_analog_output
                                         << ",interface_type=" << interface_type
                                         << ",modbus_slave_name=" << modbus_slave_name
                                         << ".start_addr=" << start_addr
                                         << ",can_port=" << can_port
                                         << "node_id=" << node_id);
    }
};
